//
//  main.m
//  04-集合(二)
//
//  Created by dllo on 16/7/7.
//  Copyright © 2016年 dllo. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "Contact.h"
#import "ContactManager.h"
int main(int argc, const char * argv[]) {
    // 1.字典
    // 存储键值对(key-value)的集合类型
    // 字典中存储数据是没有顺序的
    // 通过key值存查修改value值
    // 1 >初始化字典
    // initWithObjectsAndKeys:value, key, value, key, ...(可变参数), nil
    // 字典中只能存放对象类型
    // 如果出现汉字,代码提示,一定会失效
    NSDictionary *dic = [[NSDictionary alloc] initWithObjectsAndKeys:@"nima", @"wang", @"mingjing", @"yin", [NSNumber numberWithInt:23], @"age", @(23), @"number", nil];
    // 2 >构造器
    NSDictionary *dic1 = [NSDictionary dictionaryWithDictionary:dic];
    NSDictionary *dic2 = [NSDictionary dictionaryWithObjectsAndKeys:@"nima", @"wang", @"mingjing", @"yin", [NSNumber numberWithInt:23], @"age", nil];
    // 3 >推荐使用 字面量 字符串 @"" 数组 @[] 字典 @{key:value, key:value} ,其中@(int/float/double,..) 是NSNumber类型
    NSDictionary *dic3 = @{@"wang": @"nima" ,
                            @"yin": @"mingjing",
                            @"age": @(18)};
    // 4 >取值
    // <1> 通过key值取value(属性取值返回一个数组)
    NSString *name = [dic objectForKey:@"wang"];
    // <2> 获取所有Keys(属性取值返回一个数组)
    NSArray *allKeys = dic.allKeys;
    NSArray *allValues = dic.allValues;
    // <4> count (NSUInteger : unsigned long )
    NSUInteger count = dic.count;
    // <5> 查找字典中是否存在某个key,如果找到返回value值,如果没有返回[对象类型,或者@"not find",...任意类型]通过一个数组找到对应数组的value
    NSArray *allValueArray = [dic objectsForKeys:@[@"wang", @"sun", @"zhao"] notFoundMarker:[NSString class]];
    NSLog(@"%@",allValueArray);
    // <6> 当多个key对应相同的value时候,可以通过此value值,查找所有的key值,返回一个数组
    NSArray *allKeyValue = [dic allKeysForObject:@(23)];
    NSLog(@"%@",allKeyValue);
    // <7> 语法糖取值 arr[下标] dic[key]
    NSLog(@"%@",dic[@"name"]);
    // 可变字典 NSMutableDictionary
    // 1.初始化方式(不推荐字面量)
    NSMutableDictionary  *mutableDic = [[NSMutableDictionary alloc] initWithObjectsAndKeys:@"1", @"2", @"3", @"4", nil];
    NSMutableDictionary *mutableDic1 = [NSMutableDictionary dictionaryWithCapacity:10];
    NSMutableDictionary *mutableDic2 = [NSMutableDictionary dictionaryWithDictionary:mutableDic];
    NSMutableDictionary *mutableDic3 = [@{} mutableCopy];  //不推荐
    // 2.取值增删改
    // 如果key 已经存在,会将之前的value覆盖,如果不存在,会直接添加
    // 注意字典中的key不要重复,如果重复会对value重新赋值
    [mutableDic setObject:@"5" forKey:@"6"];
    NSLog(@"%@",mutableDic);
    // 移除
    [mutableDic removeObjectForKey:@"2"];
    [mutableDic removeObjectsForKeys:@[@"2",@"4"]];
    [mutableDic removeAllObjects];
    // 语法糖 与setObjectForKey相同
    mutableDic[@"2"] = @"11111";
    /**(完成以下需求
    需求：1、定义联系人类Contact。实例变量：姓名(拼音，首字母大写)、性别、电话号码、住址、分组名称、年龄。方法：自定义初始化方法(姓名、电话号码)、显示联系人信息。
    2、在main.m中定义字典，分组管理所有联系人。分组名为26个大写的英文字母。
    3、可以添加联系人对象，如果姓名或电话号码为空，添加失败。添加联系人到匹配的分组。
    4、删除某个分组的全部联系人。
     */
    Contact *contact = [[Contact alloc] initWithName:@"于涵" phoneNumber:@"110"];
    contact.groupName = @"Y";
    Contact *contact1 = [[Contact alloc] initWithName:@"小涵" phoneNumber:@"110"];
    contact1.groupName = @"X";
    Contact *contact2 = [[Contact alloc] initWithName:@"吴涵" phoneNumber:@"110"];
    contact2.groupName = @"W";
    Contact *contact3 = [[Contact alloc] initWithName:@"皮涵" phoneNumber:@"110"];
    contact3.groupName = @"P";
    Contact *contact4 = [[Contact alloc] initWithName:@"刘涵" phoneNumber:@"110"];
    contact4.groupName = @"L";
    Contact *contact5 = [[Contact alloc] initWithName:@"张涵" phoneNumber:@"110"];
    contact5.groupName = @"Z";
    [contact showContact];
    NSMutableDictionary *contactDictionary = [NSMutableDictionary dictionary];
    // key :A ~Z value: NSMutableArray
    // 判断名字和手机是不是空的
//    if (contact.name.length >0 && contact.phoneNumber.length >0) {
//        // 都不是空的 ,可以添加
//        // 通过联系人的分组名,取到对应的分组数组
//        NSMutableArray *contactArr = [contactDictionary objectForKey:contact.groupName];
//        // 判断数组是否存在
//        if (contactArr == nil) {
//            // 不存在,创建数组,再添加
//            contactArr = [NSMutableArray array];
//            [contactArr addObject:contact];
//            [contactDictionary setObject:contactArr forKey:contact.groupName];
//        } else {
//            // 存在,直接添加
//            [contactArr addObject:contact];
//            [contactDictionary setObject:contactArr forKey:contact.groupName];
//        }
//
//        NSLog(@"添加%@成功",contact.name);
//    } else {
//        NSLog(@"添加%@失败",contact.name);
//    }
    // 否则添加失败
    ContactManager *contactManager = [[ContactManager alloc] initWithDictionary:contactDictionary];
    [contactManager addContact:contact];
    [contactManager addContact:contact1];
    [contactManager addContact:contact2];
    [contactManager addContact:contact3];
    [contactManager addContact:contact4];
    [contactManager addContact:contact5];
    // description的作用是:把一个东西转化成字符串类型,至于怎么转化去自定义
    NSLog(@"%@",contactManager.contactDictionary);
    // 2.集合
    // 不可变 NSSet 可变 NSMutableSet
    // 1> 初始化
    // 互异性
    NSSet *set = [[NSSet alloc] initWithObjects:@"hanxu", @"hanxu", nil];
    NSLog(@"%@",set);
    // 2> 构造器
    NSSet *setObject = [NSSet setWithObjects:@"yuhan", @"yuhan", nil];
    // 3> 没有字面量
    // 取值,随机
    [set anyObject];
    // 4> count
    NSUInteger setCount = set.count;
    // 5> 集合的去重功能
    NSArray *repeatArray = @[@10, @20, @10, @30 ,@10];
    NSSet *repeatSet = [NSSet setWithArray:repeatArray];
    repeatArray = repeatSet.allObjects;
    NSLog(@"%@",repeatArray);
    // 可变集合 NSMUtableSet
    // 1> 初始化和不可变一样
    // 2> anyObject
    // 3> 可变集合 可变性
    NSMutableSet *mutableSet = [NSMutableSet set];
    [mutableSet addObject:@"1"];
    [mutableSet removeObject:@"1"];
    [mutableSet removeAllObjects];
 
    return 0;
}
